from flask_shop.user import user_bp,user_api
from flask import request
from flask_shop import models,db
# pip install flask_restful==0.3.9
from flask_restful import Resource,reqparse
import re
from flask_shop.utils.token import generate_token,verify_token,login_required
#创建视图
@user_bp.route('/')
def index():
    return 'hello'

#登录
@user_bp.route('/login/',methods=['POST'])
def login():
    #获取用户名
    # name = request.form.get('name') # content-type: application/x-www-form-urlencoded
    name = request.get_json().get('name') # content-type: application/json

    #获取密码
    pwd = request.get_json().get('pwd')

    #判断传递数据是否完整
    if not all([name,pwd]): #name pwd 同时不为空时返回true
        return {
            'status':400,
            'msg':'参数不完整'
        }
    else:
    #若参数完整 则通过用户名获取对象
        user =models.User.query.filter(models.User.name==name).first()
        #   判断用户是否存在 判断密码是否正确
        if user:
            if user.check_password(pwd):
                token=generate_token({'id':user.id})
                return {
                    'status':200,
                    'msg':'登录成功',
                    'token':token
                }
            return {
                'status':400,
                'msg':'用户名或密码错误'
            }
# 对多个用户操作  返回多个用户
class Users(Resource):
    def get(self):
        # 创建RequeParser对象
        parser=reqparse.RequestParser()
        # 添加参数 location='args'表示解析普通的请求参数 
        parser.add_argument('name',type=str,location='args') #根据用户的账号去查询
        parser.add_argument('psize',type=int,default=2,location='args') #页面大小
        parser.add_argument('pnum',type=int,default=1,help='页码错误',location='args') #设置页数 default默认没传参数时读取第一页 type是pnum返回int数据
        # 解析参数
        args=parser.parse_args()
        # 获取数据
        name=args.get('name')
        pnum=args.get('pnum')
        psize=args.get('psize')
        #判断是否传递name
        if name:
            #获取用户列表 模糊查询 paginate表明做分页查询(第几页 页面大小)
            user_list=models.User.query.filter(models.User.name.like(f'%{name}%')).paginate(page=pnum,per_page=psize)
        else:
            # 不传递name的话 userlist返回的是一个paginate对象 不能直接使用
            user_list=models.User.query.paginate(page=pnum,per_page=psize)
        data={
            'total':user_list.total, #查询出来多少条数据
            'pnum':pnum,
            'data':[u.to_dict() for u in user_list.items] #user_list是一个paginate对象 有items属性 对其进行遍历转换成json数据
        }
        return{'status':200,'msg':'获取用户列表成功','data':data}
    


    def post(self):
        # 注册用户
        #接收用户信息
        name = request.get_json().get('name')
        pwd = request.get_json().get('pwd')
        real_pwd = request.get_json().get('real_pwd') #确认密码
        
         # 验证数据的合法性
        if not all([name,pwd,real_pwd]):
            return {
                'status':400,
                'msg':'参数不完整'
            }
        
        #判断两次密码是否一致
        if pwd!=real_pwd:
            {
                'status':400,
                'msg':'两次密码不一致'
            }
            # 判断用户名是否合法
        if len(name)<2:
            return {'status': 400, 'msg': '用户名不合法'}
        #判断手机号等等
        phone=request.get_json().get('phone')
        email=request.get_json().get('email')
        nick_name = request.get_json().get('nick_name')
        if not re.match(r'^1[3456789]\d{9}$', phone):
            return {'status': 400, 'msg': '手机号不合法'}
        if not re.match('^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$', email):
            return {'status': 400, 'msg': '邮箱不合法'}
        
        try:
        # 判断用户名是否存在
            user=models.User.query.filter(models.User.name==name).first()
            if user:
                return {
                    'status':400,
                    'msg':'用户名已存在'
                }
            #天杀的课程老师 完全不对等
            #创建用户对象
            user=models.User(name=name,password=pwd,phone=phone,email=email,nick_name=nick_name)
            # 同步到数据库 而且这部分会有回滚异常 要放在异常处理里面
            db.session.add(user)
            db.session.commit()

        except Exception as e:
            print(e)
        
        return {
                    'status':200,
                    'msg':'注册成功'
                }
# 像这种Users类的 要注册api 这行代码的作用是将 Users 类作为资源添加到 Flask-RESTful API 中，并将其映射到 URL 路径 /users/
user_api.add_resource(Users,'/users/')

# 根据id获取用户信息 对单个用户操作
class User(Resource):
    def get(self,id):
        user=models.User.query.get(id)
        if user:           
           return {
                'status':200,
                'msg':"查询成功",
                'data':user.to_dict() #转化成json数据去返回
            }
        else:     
               return {
                'status':404,
                'msg':"用户不存在"
            }
# 根据指定id去更新用户信息
    def put(self,id):
        try:
            user=models.User.query.get(id)
            # 创建RequParser对象 用来接收数据
            paser=reqparse.RequestParser()
            paser.add_argument('nick_name',type=str)
            paser.add_argument('phone',type=str)
            paser.add_argument('email',type=str)
            # 解析参数
            args=paser.parse_args()

            if args.get('nick_name'):
                user.nick_name=args.get('nick_name')
            if args.get('phone'):
                user.phone=args.get('phone')    
            if args.get('email'):
                user.email=args.get('email') 

            # 参与修改等操作 记得提交参数
            db.session.commit()
            return {
                'status':200,
                'msg':'修改成功',
                'data':user.to_dict()
            }
            #加载参数
            # name=args.get('nick_name')
            # pnum=args.get('phone')
            # psize=args.get('email')
        except Exception as e:
            print(e)
            return {
                'status':400,
                'msg':'修改失败'
            }
    # 根据id去删除用户
    def delete(self,id):
        try:
            user=models.User.query.get(id)
            if user:
                db.session.delete(user)
                db.session.commit()
                return {
                    'status':200,
                    'msg':'删除成功'
                }
            else:
                return{
                    'status':400,
                    'msg':'用户不存在'
                }
        except Exception as e:
            print(e)
            return{
                'status':400,
                'msg':'删除失败'
            }



user_api.add_resource(User,'/user/<int:id>')

@user_bp.route('/reset_pwd/<int:id>')
def rest_pwd(id):
    try:
        user=models.User.query.get(id)
        #这里调用@password.setter定义的password
        user.password='123456'
        db.session.commit()
        return{  
            'status':200,
                'msg':'重置密码成功'
            }
    except Exception as e:
        print(e)
        return{
            'status':400,
            'msg':'重置密码失败'
        }


@user_bp.route('/test/')
@login_required
def test_login_required():
    return {
        'status':200,
        'msg':'验证成功'
    }
            